package com.wksc.framework.impexp.result;

import com.wksc.framework.impexp.constants.IEConstants;
import com.wksc.framework.impexp.constants.TaskStat;
import com.wksc.framework.impexp.log.ImpExpLog;
import com.wksc.framework.impexp.task.Task;
import com.wksc.framework.impexp.template.BaseTemplate;
import com.wksc.framework.impexp.util.ClassFactory;

import java.util.Observable;
import java.util.Observer;

/**
 * <p>
 * Title(文件名): StatObserver.java
 * </p>
 * <p>
 * Description(描述):
 * <p>
 * 当任务状态发生改变时自动根据任务的状态进行相应的处理
 * </p>
 * <p>
 * Copyright(版权): Copyright (c) 2011
 * </p>
 * <p>
 * Company(公司): 成都四方信息技术有限公司
 * </p>
 * <p>
 * CreateTime(生成日期)：2011-10-26下午07:39:31
 * </p>
 * 
 * @author wanglei
 * @version impExp_C13
 */
public class StatObserver implements Observer {

	private ImpExpLog log = ClassFactory.getLog(StatObserver.class);
	private BaseTemplate baseTemplate;
	private BaseResult result;

	@Override
	public void update(Observable o, Object arg) {
		Task task = (Task) o;
		baseTemplate = (BaseTemplate) arg;
		TaskStat taskStat = task.getTaskStat();
		result = task.getResult();

		//新建任务, 任务开始和任务结束时不使用operation(String message)方法来记录信息
		if (0 != taskStat.toByte() && 2 != taskStat.toByte()
				&& 3 != taskStat.toByte() && 9 != taskStat.toByte()) {
			log.operation(impExpLogInfo(task));
		}

		switch (taskStat) {
		// 不需要特殊处理的状态仅使用info级别记录日志以供调试
		case TASK_WAITING:
			//更新数据库
			updateDb(taskStat.toByte(), ClassFactory.getI18n().getWaitinginfo());
			break;
		case TASK_PAUSED:
			//更新数据库
			updateDb(taskStat.toByte(), ClassFactory.getI18n()
					.getTaskpauseinfo());
			break;
		case TASK_RESUME:
			//更新数据库
			updateDb(taskStat.toByte(), ClassFactory.getI18n()
					.getTaskResumeInfo());
			break;
		case TASK_RUNNING:
			logToDb(task);
			//更新数据库
			updateDb(taskStat.toByte(), ClassFactory.getI18n()
					.getTaskstartinfo());
			break;
		case TASK_RELOADED:
			//更新数据库
			updateDb(taskStat.toByte(), ClassFactory.getI18n()
					.getReloadJobsInfo());
			break;
		case TASK_CANCELLED:
		case TASK_FINISHED:
			// 设置结束信息
			if ("".equals(result.getResultMsg().trim())) {
				result.setResultMsg(getResultMsg());
			}
			// 更新数据库信息
			ClassFactory.getImpExpDao().changeState(baseTemplate.getFileName(),
					taskStat.toByte(), result.getResultMsg(),
					result.getPostfix().toInt(), result.getAllCorrect(), true,
					false);
			// 日志入库
			logToDb(task);
			break;
		case TASK_CANCELLING:
			//更新数据库
			updateDb(taskStat.toByte(), ClassFactory.getI18n()
					.getTaskcancellinginfo());
			break;
		case TASK_EXCEPTION:
			String exceptionMsg;
			if (!"".equals(result.getResultMsg().trim())) {
				exceptionMsg = result.getResultMsg();
			} else {
				exceptionMsg = ClassFactory.getI18n().getTaskexceptioninfo();
			}
			//更新数据库
			updateDb(taskStat.toByte(), exceptionMsg);
			break;
		}

		// 这里改变Global值的状态以表明任务状态已发生了改变,在页面查看后将状态重置
		setStateChange();
	}

	/**
	 * 方法描述：日志入库的方法
	 * 
	 * @creator wanglei
	 * @param task
	 */
	private void logToDb(Task task) {
		try {
			String logInfo=impExpLogInfo(task);
			// *** BEGIN *** R001C20L20001B01/2370 2013-1-1 pengqianyu sf1011 Add
			log.info(logInfo);
			// *** END *** R001C20L20001B01/2370 2013-1-1 pengqianyu sf1011 Add
			log.operation(logInfo, task.getBaseTemplate().getIp(),
					task.getBaseTemplate().getTaskType().toTypeByte(), task
							.getBaseTemplate().getOperatObj(), task
							.getBaseTemplate().getUsers());
		} catch (Exception e) {
			log.operation("Log import Export Info to Db error");
		}
	}

	/**
	 * 方法描述：用于任务状态发生改变后修改GlobalControl中isDbSearch属性值
	 * 
	 * @creator wanglei
	 */
	private synchronized void setStateChange() {
		ClassFactory.getImpExpDao().setDbSearch();
	}

	/**
	 * 方法描述：统一更新数据
	 * 
	 * @creator wanglei
	 * @param msg
	 */
	private void updateDb(int taskState, String msg) {
		// 最后两个参数为-1表示现暂不需要该字段填入正确的值,采用-1占位
		ClassFactory.getImpExpDao().changeState(baseTemplate.getFileName(),
				taskState, msg, -1, -1, false, false);
	}

	/**
	 * 方法描述：根据模板自动拼导入导出操作日志信息
	 * 
	 * @param task
	 *            操作信息: 开始/结束/暂停/恢复/等等...(可扩展)
	 * @return 输出的日志信息格式:
	 *         <p>
	 *         xxx操作员 [导入/导出] 文件名: [开始/结束/暂停/恢复/其他]
	 *         </p>
	 * @creator wanglei
	 */
	private String impExpLogInfo(Task task) {
		StringBuffer logInfo = new StringBuffer();
		logInfo.append(baseTemplate.getOperator()).append("[").append(
				task.getBaseTemplate().getTaskType().toString()).append("]")
				.append(baseTemplate.getFileName()).append(": ").append(
						task.getTaskStat().toString());
		return logInfo.toString();
	}

	/**
	 * 方法描述：任务顺利完成后拼任务结果信息
	 * 
	 * @creator wanglei
	 * @return
	 */
	private String getResultMsg() {
		switch (baseTemplate.getTaskType()) {
		case EXP_TASK:
			return getExpResultMsg();
		case IMP_ADD_TASK:
		case IMP_DEL_TASK:
			return getImpResultMsg();
		}
		return null;
	}

	/**
	 * 方法描述：拼导入任务的结果信息
	 * 
	 * @creator wanglei
	 * @return
	 */
	private String getImpResultMsg() {
		StringBuffer resultMsg = new StringBuffer();
		ImpResult ir = (ImpResult) result;
		if (IEConstants.NO_OPS != ir.getSent()) {
			switch (ir.getBizType()) {
			case IEConstants.ST_DB:
				resultMsg.append(ClassFactory.getI18n().getSavetodb());
				break;
			case IEConstants.ST_ALTER:
				resultMsg.append(ClassFactory.getI18n().getSendconfiguation());
				break;
			case IEConstants.ST_ORDER:
				resultMsg.append(ClassFactory.getI18n().getSendOrder());
				break;
			}

			switch (ir.getSent()) {
			case IEConstants.SUCCEED:
				resultMsg.append(ClassFactory.getI18n().getSucceeded());
				break;
			case IEConstants.FAIL:
				resultMsg.append(ClassFactory.getI18n().getFailed());
				break;
			}
		}

		if (result.isTaskCancelled()) {
			if (ir.isSocket()) {
				resultMsg.append(ClassFactory.getI18n().getSocketTaskcancelled(
						ir.getTotalCorrectNum(), ir.getTotalErrNum()));
			} else {
				resultMsg.append(ClassFactory.getI18n().getTaskcancelled(
						ir.getTotalCorrectNum(), ir.getTotalErrNum()));
			}
		} else {
			if (ir.isSocket()) {
				resultMsg.append(ClassFactory.getI18n().getImportSocketInfo(
						ir.getTotalNum(), ir.getTotalCorrectNum(),
						ir.getTotalErrNum()));
			} else {
				resultMsg.append(ClassFactory.getI18n().getImportInfo(
						ir.getTotalNum(), ir.getTotalCorrectNum(),
						ir.getTotalErrNum()));
			}

		}

		return resultMsg.toString();
	}

	/**
	 * 方法描述：拼导出任务的结果信息
	 * 
	 * @creator wanglei
	 * @return
	 */
	private String getExpResultMsg() {
		StringBuffer resultMsg = new StringBuffer();
		if (result.isTaskCancelled()) {
			//任务取消后的消息
			resultMsg.append(ClassFactory.getI18n().getTaskcancelinfo());
		} else {
			//任务正常结束的消息
			resultMsg.append(ClassFactory.getI18n().getTotalexported(
					result.getTotalNum()));
		}
		return resultMsg.toString();

	}
}
